﻿package com.zouloux.ui
{
	// Importation des classes
	import com.greensock.easing.Strong;
	import com.zouloux.core.base.DocumentBase;
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.MouseEvent;
	
	/**
	 * ...
	 * @author ZoulouX
	 */
	// La classe de bouton générique
	// Elle permet de créer des tween de type rollOver rollOut click et release
	// Si des labels ne portent pas ces noms.
	// La variable selected bloque le bouton au rollover
	public class GenericButton extends Component implements IComponent
	{
		// Booleen pour savoir si ce bouton est séléctionné
		protected var _selected			:Boolean 				= false;
		
		// Si le curseur est au dessus du bouton
		protected var _over				:Boolean 				= false;
		
		// Si le bouton est pressé
		protected var _pressed			:Boolean 				= false
		
		// Les tweens
		protected var _tweenOver		:TweenConfig			= new TweenConfig(Strong.easeOut, .5, {colorMatrixFilter:{brightness:1.3}});
		protected var _tweenOut			:TweenConfig			= new TweenConfig(Strong.easeOut, .5, {colorMatrixFilter:{brightness:1}});
		protected var _tweenPress		:TweenConfig			= new TweenConfig(Strong.easeOut, .5, {colorMatrixFilter:{brightness:.6}});
		protected var _tweenRelease		:TweenConfig			= new TweenConfig(Strong.easeOut, .5, {colorMatrixFilter:{brightness:1.3}});
		
		
		// Les getters
		public function get selected():Boolean
		{
			return _selected;
		}
		public function get over():Boolean
		{
			return _over;
		}
		public function get pressed():Boolean
		{
			return _pressed;
		}
		public function get tweenOver():TweenConfig
		{
			return _tweenOver;
		}
		public function get tweenOut():TweenConfig
		{
			return _tweenOut;
		}
		public function get tweenPress():TweenConfig
		{
			return _tweenPress;
		}
		public function get tweenRelease():TweenConfig
		{
			return _tweenRelease;
		}
		
		
		// Les setters
		public function set selected(value:Boolean):void 
		{
			// Enregistrer la valeur
			_selected = value;
			
			// Actualiser l'apparence
			if (_selected)
				doRollOver();
			else 
				doRollOut();
		}
		public function set tweenOver(value:TweenConfig):void 
		{
			_tweenOver = value;
		}
		public function set tweenPress(value:TweenConfig):void 
		{
			_tweenPress = value;
		}
		public function set tweenRelease(value:TweenConfig):void 
		{
			_tweenRelease = value;
		}
		public function set tweenOut(value:TweenConfig):void 
		{
			_tweenOut = value;
		}
		
		
		// Le constructeur
		public function GenericButton (pButtonMode:Boolean = true)
		{
			// Construire le parent
			super();
			
			// Stopper dans tous les cas
			stop();
			
			// En buttonMode
			buttonMode = pButtonMode;
			
			// Désactiver le click sur les enfants
			mouseChildren = false;
		}
		
		// L'initialisation
		override public function init ():void
		{
			// Ajouter les écouteur avec la souris
			this.addEventListener(MouseEvent.ROLL_OVER, rollOverHandler);
			this.addEventListener(MouseEvent.ROLL_OUT, rollOutHandler);
			this.addEventListener(MouseEvent.MOUSE_DOWN, pressHandler);
			DocumentBase.stage.addEventListener(MouseEvent.MOUSE_UP, releaseHandler);
		}
		
		// Le rollOver
		public function rollOverHandler (event:MouseEvent = null):void
		{
			// Le curseur est au dessus
			_over = true;
			
			// Vérifier si on a le droit
			if (!_selected && !_pressed)
				doRollOver();
		}
		
		// Le rollOut
		public function rollOutHandler (event:MouseEvent = null):void
		{
			// Le curseur n'est plus au dessus
			_over = false;
			
			// Vérifier si on a le droit
			if (!_selected && !_pressed)
				doRollOut();
		}
		
		// Le press
		public function pressHandler (event:MouseEvent):void
		{
			// Le bouton est pressé
			_pressed = true;
			
			// Vérifier si on a le droit
			if (!_selected)
				doPress();
		}
		
		// Le release
		public function releaseHandler (event:MouseEvent):void
		{
			// Vérifier que le bouton était bien pressé
			if (_pressed)
			{
				// Le bouton n'est plus pressé
				_pressed = false;
				
				// Vérifier si le curseur n'est plus au dessus
				if (!_over)
					rollOutHandler();
				else if (!_selected)
					doRelease();
			}
		}
		
		// Les méthodes privées d'exécution
		protected function doRollOver ():void
		{
			checkAndPlay("rollover") || _tweenOver.to(this);
		}
		protected function doRollOut ():void
		{
			checkAndPlay("rollout") || _tweenOut.to(this);
		}
		protected function doPress ():void
		{
			checkAndPlay("press") || _tweenPress.to(this);
		}
		protected function doRelease ():void
		{
			checkAndPlay("release") || _tweenRelease.to(this);
		}
	}
}